/* !
 * @Author: miss-tree
 * @Date: 2024-12-05 23:11:37
 * @Description: token验证,直接redis读取token比较快，不用每次都查询数据库
*/
const jwt = require('jsonwebtoken');
const {Redis} = require('../utils/redis')
const config = require('../config/index.js');
const secretKey = config.secretKey; // 替换为实际的密钥

let r = null

function checkTokenValidity (token,req, res,cb ) {
 // 在这里编写验证token有效性的逻辑
 // 例如，我们可以检查token是否在数据库中，是否过期等
 // 这里只是一个示例，实际应用中需要根据具体需求编写验证逻辑
 jwt.verify(token, secretKey, async (err, user) => {
  if (err) {
   // 如果token过期或者无效，返回403 Forbidden 并且在数据库中删除
   res.status(403).json({ message: 'Invalid token' });
   return
  }
  // 从redis中获取用户信息判断是否存在登录
  if(!r) r = await Redis()
  let uId = await r.get(user.id)
  // 如果token有效，将用户信息附加到请求对象上，以便后续处理使用
  if(uId) {
   req.user = user;
   cb()
  } else {
   // 如果token无效，返回403 Forbidden 并且在数据库中删除
   res.status(403).json({ message: 'Invalid token' });
  }
 });
}


async function authenticateToken (req, res, next) {
 // 从请求头中获取token
 const authHeader = req.headers['authorization'];
 const token = authHeader && authHeader.split(' ')[1];

 if (token == null){
  // 如果没有token，返回401 Unauthorized
  return res.status(401).send("Sorry, it is empty Unauthorized");
 } else {
  // 在这里验证token的有效性，例如检查token是否在数据库中，是否过期等
  // 假设我们有一个函数checkTokenValidity来验证token
  checkTokenValidity(token, req, res,()=>{
   next(); // 继续处理请求
  })
 }
}

module.exports = {
 checkTokenValidity,
 authenticateToken,
};